package com.finance.console.service.user;

import com.finance.console.dao.UserDAO;
import com.finance.console.entity.User;
import com.finance.console.common.EncryptUtils;
import com.finance.console.common.FinanceException;
import java.text.SimpleDateFormat;
import java.sql.SQLException;
import java.util.List;

public class UserServiceImpl implements UserService {
    private final UserDAO userDAO = new UserDAO();

    // 登录功能
    @Override
    public User login(String username, String password) throws FinanceException, SQLException {
        User user = userDAO.findByUsername(username);
        if (user == null) {
            throw new FinanceException("用户名不存在");
        }
        // 验证密码（加密比对）
        if (!EncryptUtils.checkPassword(password, user.getPassword())) {
            throw new FinanceException("密码错误");
        }
        return user;
    }

    // 注册功能
    @Override
    public int register(User user) throws SQLException {
        // 1. 加密密码（存储加密后的值，避免明文）
        String encryptedPassword = EncryptUtils.encryptPassword(user.getPassword());
        user.setPassword(encryptedPassword);

        // 2. 设置创建时间（默认当前时间）
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String createTime = sdf.format(new java.util.Date()); // 使用util.Date更通用
        user.setCreateTime(createTime);

        // 3. 默认为普通用户角色
        if (user.getRole() == null || user.getRole().isEmpty()) {
            user.setRole("user");
        }

        // 4. 默认为启用状态
        if (user.getStatus() == 0) {
            user.setStatus(1);
        }

        // 5. 保存到数据库
        return userDAO.addUser(user);
    }

    // 按用户名查询用户
    @Override
    public User findByUsername(String username) throws SQLException {
        return userDAO.findByUsername(username);
    }

    // 管理员：获取所有用户（实现接口中缺失的方法）
    @Override
    public List<User> getAllUsers() throws SQLException {
        return userDAO.getAllUsers();
    }

    // 管理员：修改用户状态（启用/禁用）
    @Override
    public boolean updateUserStatus(int userId, int status) { // 补充声明
        try {
            int rows = userDAO.updateUserStatus(userId, status);
            return rows > 0;
        } catch (SQLException e) {
            throw new RuntimeException("修改用户状态失败", e);
        }
    }

    // 管理员：删除用户（级联删除关联数据）
    @Override
    public boolean deleteUser(int userId) {
        try {
            int rows = userDAO.deleteUser(userId);
            return rows > 0;
        } catch (SQLException e) {
            throw new RuntimeException("删除用户失败", e);
        }
    }

    // 验证是否为管理员角色
    @Override
    public boolean isAdmin(User user) {
        return user != null && "ADMIN".equalsIgnoreCase(user.getRole());
    }
}